package com.frank.demo.data;

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.mybatis.spring.SqlSessionFactoryBean;

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by zhy on 2018/5/14.
 */
public class Mybatis {

    public static void main(String[] args) {
        Mybatis mybatis = new Mybatis();
        DataSource ds = mybatis.initDatasource();
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(ds);
    }

    //初始化jdbc驱动
    public DruidDataSource initDatasource() {
        DruidDataSource ds = new DruidDataSource();

        List<Filter> proxyFilters = new ArrayList<Filter>();
        StatFilter stat = new StatFilter();//过滤器
        stat.setMergeSql(false);
        stat.setSlowSqlMillis(3000);
        proxyFilters.add(stat);
        ds.setProxyFilters(proxyFilters);

        ds.setMaxActive(5);//连接池最大使用连接
        ds.setInitialSize(2);//初始化大小
        ds.setMinIdle(2);//连接池最小空闲

        ds.setValidationQuery("Select 'x'");//测试有效的sql query
        ds.setValidationQueryTimeout(1);//测试有效的超时时间

        ds.setTestOnBorrow(false);//获取连接测试时是否有效
        ds.setTestOnReturn(false);//归还连接时测试是否有效
        ds.setTestWhileIdle(true);//申请连接的时候检测，如果空闲时间大于timeBetweenEvictionRunsMillis，执行validationQuery检测连接是否有效。

        ds.setPoolPreparedStatements(true);//打开Statement缓存
        ds.setMaxPoolPreparedStatementPerConnectionSize(500);//指定每个连接上Statement缓存的大小

        ds.setMaxWait(100);//获取连接时最大等待时间，单位毫秒，配置了maxWait之后，缺省启用公平锁.
        ds.setUseUnfairLock(true);//使用非公平锁

        ds.setTimeBetweenEvictionRunsMillis(6000);//逐出时间检测间隔
        ds.setMinEvictableIdleTimeMillis(60000);//最小逐出时间

        ds.setRemoveAbandoned(true);//是否开启连接泄漏
        ds.setRemoveAbandonedTimeoutMillis(1200);//连接泄漏的超时时间

        ds.setLogAbandoned(true);//关闭连接泄漏的连接时打印堆栈信息

        ds.setUrl("jdbc:mysql://127.0.0.1:3306/bet");//连接地址，jdbc协议
        ds.setUsername("root");//账号
        ds.setPassword("");//密码

        return ds;
    }
}
